from django.db import models


class TagModel(models.Model):
    """
        标签库

        用途：
        该模型用于存储题目的标签， 例如：数组，字符串，数学

        关联关系：
        自关联

        创建人：
        魏文海，创建于2024年7月25日
    """
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=100, verbose_name='标签名称')
    create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
    update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间')
    is_delete = models.BooleanField(default=False, verbose_name='是否删除')
    parent = models.ForeignKey('self', on_delete=models.CASCADE, null=True, blank=True, verbose_name='父标签')

    class Meta:
        db_table = 'tag'
        verbose_name = '标签库'
        verbose_name_plural = verbose_name


class TypeModel(models.Model):
    """
        题目类型库

        用途：
        该模型用于存储题目的类型， 例如：简单，中等，困难

        关联关系：

        创建人：
        魏文海，创建于2024年7月25日
    """
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=100, verbose_name='类型名称')
    create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
    update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间')
    is_delete = models.BooleanField(default=False, verbose_name='是否删除')

    class Meta:
        db_table = 'type'
        verbose_name = '题目类型库'
        verbose_name_plural = verbose_name


class ProblemModel(models.Model):
    """
        题目库

        用途：
        该模型用于记录题目

        关联关系：
        n-1 tag
        n-1 type
        1-1 test_case

        创建人：
        魏文海，创建于2024年7月25日
    """
    DIFFICULTY_CHOICES = [
        ('Easy', '简单'),
        ('Medium', '中等'),
        ('Hard', '困难'),
    ]

    id = models.AutoField(primary_key=True)
    title = models.CharField(max_length=100, verbose_name='题目标题')
    problem_description = models.TextField(verbose_name='题目描述')
    input_description = models.TextField(verbose_name='输入描述')
    output_description = models.TextField(verbose_name='输出描述')
    tag = models.ForeignKey(TagModel, on_delete=models.DO_NOTHING, verbose_name='题目标签')
    type = models.ForeignKey(TypeModel, on_delete=models.DO_NOTHING, verbose_name='题目类型')
    answer = models.TextField(verbose_name='题目答案')
    difficulty = models.CharField(max_length=10, choices=DIFFICULTY_CHOICES, default='Medium', verbose_name='难度')
    total_submissions = models.IntegerField(default=0, verbose_name='总提交数')
    accepted_submissions = models.IntegerField(default=0, verbose_name='通过提交数')
    time_limit = models.IntegerField(default=1000, verbose_name='时间限制(ms)')
    memory_limit = models.IntegerField(default=256, verbose_name='内存限制(MB)')
    create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
    update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间')
    is_delete = models.BooleanField(default=False, verbose_name='是否删除')

    class Meta:
        db_table = 'problem'
        verbose_name = '题目库'
        verbose_name_plural = verbose_name

    @property
    def pass_rate(self):
        """计算通过率"""
        if self.total_submissions == 0:
            return 0
        return round(self.accepted_submissions / self.total_submissions * 100, 2)

    def __str__(self):
        return f"{self.id}. {self.title}"
